(deftemplate Caracteristici
"defineste caracteristici generale"

(slot dimensiunea_sistemului 
(type INTEGER) 
(default 0))

(slot jacobianul_sistemului 
(type INTEGER) 
(default 1))

(slot forma_sistemului 
(type STRING) 
(default "generala"))

(slot grad_linearitate_al_sistemului 
(type STRING) 
(default "oarecare"))
)

(deftemplate solutia_sistemului 

(slot solutie 
(type STRING)
(default "Speciala"))
)

(deftemplate solutia_proviziorie

(slot solutie 
(type STRING)
(default ""))
)

(defrule solutie 
(solutia_sistemului (solutie ?metoda)) 
=> (printout t "Metoda recomandata este : " ?metoda " ." crlf))

;;;======================================================
;;;======================================================
;;;       
;;;     				 define general rule 
;;;     
;;;======================================================	
(reset)

(defrule reguli_generale1
	(Caracteristici {jacobianul_sistemului != 0 } (forma_sistemului "generala") (grad_linearitate_al_sistemului "oarecare"))
	=>
	(assert (solutia_proviziorie (solutie diferente_dimensiuni)))
)	
(defrule reguli_generale2
	(Caracteristici {dimensiunea_sistemului > 10 &&  dimensiunea_sistemului < 500} (forma_sistemului "lacunara"))
	=>
	(assert (solutia_proviziorie (solutie diferente_grade)))
)	
(defrule reguli_generale3
	(Caracteristici {dimensiunea_sistemului > 10 &&  dimensiunea_sistemului < 500} (grad_linearitate_al_sistemului "oarecare"))
	=>
	(assert (solutia_proviziorie (solutie diferente_forme)))
)
;;;======================================================
;;;       
;;;     				 define rule for Newton_clasica,Newton_discret,Secanta,Steffensen
;;;     
;;;======================================================	
(defrule cauta_NC
	(solutia_proviziorie (solutie diferente_dimensiuni))
	(Caracteristici {dimensiunea_sistemului < 10 })
	
	=>
	(assert (solutia_sistemului (solutie Newton_clasica)))
	(assert (solutia_sistemului (solutie Newton_discret)))
	(assert (solutia_sistemului (solutie Secanta)))
	(assert (solutia_sistemului (solutie Steffensen)))
)	
  
;;;======================================================
;;;       
;;;     				 define rule for Newton simpl. gen.
;;;     
;;;======================================================	
(defrule cauta_NSG
	(solutia_proviziorie (solutie diferente_dimensiuni))
	(Caracteristici {dimensiunea_sistemului > 10 && dimensiunea_sistemului < 50 })
	
	=>
	(assert (solutia_sistemului (solutie Newton_simpl._gen.)))
)	
;;;======================================================
;;;       
;;;     				 define rule for Linii paralele
;;;     
;;;======================================================	
(defrule cauta_LP
	(solutia_proviziorie (solutie diferente_dimensiuni))
	(Caracteristici {dimensiunea_sistemului > 50 && dimensiunea_sistemului < 500 })
	(Caracteristici {jacobianul_sistemului > 1000 })
	=>
	(assert (solutia_sistemului (solutie Linii_paralele)))
)
;;;======================================================
;;;       
;;;     				 define rule for Broyden
;;;     
;;;======================================================	
(defrule cauta_BRD
	(solutia_proviziorie (solutie diferente_dimensiuni))
	(Caracteristici {dimensiunea_sistemului > 10 && dimensiunea_sistemului < 500 })
	=>
	(assert (solutia_sistemului (solutie Broyden)))
)
;;;======================================================
;;;       
;;;     				 define rule for Frideman,Gradient_conjugat
;;;     
;;;======================================================	
(defrule cauta_FRI
	(solutia_proviziorie (solutie diferente_grade))
	(Caracteristici (grad_linearitate_al_sistemului "oarecare" ))
	(Caracteristici {dimensiunea_sistemului > 50 })
	=>
	(assert (solutia_sistemului (solutie Frideman)))
	(assert (solutia_sistemului (solutie Gradient_conjugat)))
)
;;;======================================================
;;;       
;;;     				 define rule for SOR simpla
;;;     
;;;======================================================	
(defrule cauta_SORS
	(solutia_proviziorie (solutie diferente_grade))
	(Caracteristici {jacobianul_sistemului > 500 })
	(Caracteristici (grad_linearitate_al_sistemului "slab_neliniara" ))
	=>
	(assert (solutia_sistemului (solutie SOR_simpla)))
)
;;;======================================================
;;;       
;;;     				 define rule for SOR generala
;;;     
;;;======================================================	
(defrule cauta_SORG
	(solutia_proviziorie (solutie diferente_grade))
	(Caracteristici (grad_linearitate_al_sistemului "slab_neliniara" ))
	=>
	(assert (solutia_sistemului (solutie SOR_generala)))
)
;;;======================================================
;;;       
;;;     				 define rule for ADI clasica,ADI_Kellog
;;;     
;;;======================================================	
(defrule cauta_ADIC
	(solutia_proviziorie (solutie diferente_forme))
	(Caracteristici (forma_sistemului "suma" ))
		=>
	(assert (solutia_sistemului (solutie ADI_clasica)))
	(assert (solutia_sistemului (solutie ADI_Kellog)))
)
;;;======================================================
;;;       
;;;     				 define rule for Speciale
;;;     
;;;======================================================	

(defrule cauta_SPEC
	
		=>
	(assert (solutia_sistemului (solutie Speciale)))
)


(assert (Caracteristici (dimensiunea_sistemului 47) (jacobianul_sistemului 5) (forma_sistemului "generala") (grad_linearitate_al_sistemului "oarecare")))

(run)

(defrule cauta_monica_rule
	(solutia_proviziorie (solutie diferente_dimensiuni))
	(Caracteristici {dimensiunea_sistemului < 10 && dimensiunea_sistemului > 5 })
	=>
	(assert (solutia_sistemului (solutie Monica)))
)

(assert (Caracteristici (dimensiunea_sistemului 7) (jacobianul_sistemului 5) (forma_sistemului "generala") (grad_linearitate_al_sistemului "oarecare")))

(run)